package 捕获分组和非捕获分组;
public class RegexDemo10 {
    public static void main(String[] args) {
        /*每组是有组号的，也就是序号。
        规则1：从1开始，连续不间断。
        规则2：以左括号为基准，最左边的是第一组，其次为第二组，以此类推。
        (\d+)(\d+)(\d+)
        (\d+(\d+))(\d+)*/

        //需求1: 判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
//举例:  a123a   b456b   17891   &abc&   a123b(false)
        //   \\组号:表示第X组再使用一次
        String regex1 = "(.).+\\1";
        System.out.println("a123a".matches(regex1));
        System.out.println("b456b".matches(regex1));
        System.out.println("17891".matches(regex1));
        System.out.println("&abc&".matches(regex1));
        System.out.println("a123b".matches(regex1));
        System.out.println("-------------------");
//需求2: 判断一个字符串的开始部分和结束部分是否一致? 可以有多个字符
//举例:  abc123abc   b456b   123789123   &!gbc&!g   abc123abd(false)
        String regex2="(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));
        System.out.println("b456b".matches(regex2));
        System.out.println("123789123".matches(regex2));
        System.out.println("&!gbc&!g".matches(regex2));
        System.out.println("abc123abd".matches(regex2));
        System.out.println("-------------------");
//需求3: 判断一个字符串的开始部分和结束部分是否一致? 开始部分内部每个字符也需要一致
//举例:  aaa123aaa   bbb456bbb   111789111   &&abc&&    aaa123aab
        //(.+)看作一组
        // \\2把首字母拿出来用
        // *作用于\\2,表示出现0次或多次
        //左括号为基准分组
        String regex3="((.+)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex3));
        System.out.println("bbb456bbb".matches(regex3));
        System.out.println("111789111".matches(regex3));
        System.out.println("&&abc&&".matches(regex3));
        System.out.println("aaa123aab".matches(regex3));
        //后面还要使用本组数据
        // 正则内部使用: \\组号
        // 正则外部使用: $组号
        /*
        我要学学编编编编程程程程程程
        变成:问我要学编程
        */
        String str="我要学学编编编编程程程程程程";
        //(.)把重复的内容第一个字符看作一组
        //\\1第一组的字符  +出现至少一次
        //$1外部使用第一组的内容
        String result=str.replaceAll("(.)\\1+","$1");
        System.out.println(result);
        /*
        非捕获分组：分组之后不需要再用本组数据，仅仅是把数据括起来。
        身份证号码：
        4108011990228457X
        51080119760922369
        15040119810705387X
        130133197204039024
        43010219760646442
                */
        //身份证号码的简易正则表达式
        //非捕获分组：仅仅是把数据括起来
        //特点：(?:)是非捕获分组不占用组号
        String regex="[1-9]\\d{16}(?:\\d|X|x)";
    }
}
